#include <windows.h>
#include <GL/glut.h>
#include <iostream>
#include "std_lib_facilities.h"

GLfloat spin = 0.0;

void init( void )
{
	cout << "init" << endl;
	//Выбрать фоновый (очищающий) цвет
	glClearColor( 0.0, 0.0, 0.0, 0.0 );
	//Установить проекцию
	//glMatrixMode( GL_PROJECTION );
	glMatrixMode( GL_FLAT );
	//glLoadIdentity();

	//glOrtho( 0.0, 1.0, 0.0, 1.0, -1.0, 1.0 );
}
void display(void)
{
	cout << "display" << endl;
	//Очистить экран glClear(GL_COLOR_BUFFER_BIT);
	glClear(GL_COLOR_BUFFER_BIT);
	glPushMatrix();
	glRotatef(spin,0.0,0.0,1.0);
	glColor3f(1.0,1.0,1.0);
	glRectf(-25.0,-25.0,25.0,25.0);
	glPopMatrix();
	glutSwapBuffers();
	//Не ждем. Начинаем выполнять буферизованные
	//команды OpenGL
	//glFlush();
}


void spinCCWDisplay(void)
{
	spin += 0.1;
	if ( spin > 360.0 ) 
		spin -= 360.0;
		
	glutPostRedisplay();
}

void spinCWDisplay(void)
{
	spin -= 0.1;
	if ( spin < -360.0 ) 
		spin += 360.0;
		
	glutPostRedisplay();
}

void reshape ( int w, int h )
{
	glViewport(0, 0, (GLsizei) w, (GLsizei) h);
	glMatrixMode( GL_PROJECTION );
	glLoadIdentity();
	glOrtho( -50.0, 50.0, -50.0, 50.0, -1.0, 1.0 );
	glMatrixMode( GL_MODELVIEW );
	glLoadIdentity();
}

//При нажатии левой кнопки зарегистрировать
//функцию фоновой обработки (поворота)
//При нажатии правой – отменить регистрацию
void mouse ( int button, int state, int x, int y )
{
	switch ( button )
	{
		case GLUT_LEFT_BUTTON:
			if ( state == GLUT_DOWN ) glutIdleFunc ( spinCCWDisplay ); break;
		case GLUT_RIGHT_BUTTON: 
			if ( state == GLUT_DOWN ) glutIdleFunc ( spinCWDisplay ); break;
		case GLUT_MIDDLE_BUTTON: 
			if ( state == GLUT_DOWN ) glutIdleFunc ( NULL ); break;
			
	}
}

//Запросить режим двойной буферизации
//Зарегистрировать функции обработки мышиного ввода
int main( int argc, char **argv )
{
	glutInit( &argc, argv );
	glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
	glutInitWindowSize( 250,250 );
	glutInitWindowPosition( 100,100 );
	glutCreateWindow( "Двойная буферизация" );
	init();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutMouseFunc(mouse);
	glutMainLoop();
	return 0;
}

